﻿using System;
using System.Data.OleDb;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

namespace devoirBD2
{
    public class CommandeTable
    {
        private static CommandeTable instance;
        private List<Commande> commandes;

        private CommandeTable()
        {
            commandes = new List<Commande>();
        }

        public static CommandeTable getInstance()
        {
            if (instance == null)
            {
                instance = new CommandeTable();
            }

            return instance;
        }

        public List<Commande> getCommandes()
        {
            return commandes;
        }

        public void loadCommandes()
        {
            commandes.Clear();
            
            string query = "SELECT idcommande, idfournisseur, datecommande, nomfournisseur, montanttotal ";
            query += "FROM (SELECT idcommande, idfournisseur, datecommande FROM commandeentete ORDER BY datecommande DESC) ";
            query += "NATURAL LEFT JOIN (SELECT idcommande, SUM(quantite * prix) AS montanttotal FROM commandedetail GROUP BY idcommande) ";
            query += "NATURAL INNER JOIN (SELECT idfournisseur, nomfournisseur FROM fournisseur) ";

            Bd bd = Bd.getInstance();

            bd.openConnection();

            OracleDataReader dr = bd.executeReader(query);

            while (dr.Read())
            {
                Commande cmd = new Commande(Bd.valideLong(dr["idcommande"]),
                                            Bd.valideLong(dr["idfournisseur"]),
                                            Bd.valideDate(dr["datecommande"]),
                                            Bd.valideString(dr["nomfournisseur"]),
                                            Bd.valideDecimal(dr["montanttotal"]));

                commandes.Add(cmd);
            }

            bd.closeConnection();
        }

        public void deleteCommandes(int[] indices)
        {
            List<Commande> commandesASupprimer = new List<Commande>();
            
            foreach (int i in indices)
            {
                //On crée une liste des objets à supprimer
                commandesASupprimer.Add(commandes[i]);

                //On supprime la commande de la base de données.
                commandes[i].delete();
            }

            //On boucle dans les commandes à supprimer
            foreach (Commande cmd in commandesASupprimer)
            {
                //On enlève l'objet de la liste des commandes
                commandes.Remove(cmd);
            }
        }
    }
}
